MYC-deficiency impairs the development of effector/memory T lymphocytes
Authors :Mathis Nozais1, Marie Loosveld1,2, Saran Pankaew1, Clémence Grosjean1, Noémie Gentil1, Julie Quessada1, Cyrille Mionnet1, Delphine Potier1@ & Dominique Payet-Bornet1@
*These authors contributed equally: Mathis Nozais, Marie Loosveld; @ Corresponding authors: Dr Delphine Potier and Dr Dominique Payet-Bornet
Link to article : (TO come)
If you have any questions on this analysis, please contact Mathis Nozais or Delphine Potier (just delphine ? contact author)
to do before publish
#change all path to data showing my environment (NAS...) mettre lien à partir de Workspace ou il dowloaderont les fichier source (fastq et objet R)
#do we want to show the code in rmd ?
# GO mise en ligne des fichier brut
#test final sans aucun objet, avec le premier obj et avec le deuxieme
#change output path
[1] “You are starting the analysis from count matrix obtain with CellRanger and Cite-seq-count”
Loading the first experiment
Looking to HTO distribution accross sample :
#HTO distribution
par(mfrow=c(1,1))
par(las=2)
par(mar=c(5,15,3,3))
barplot(rowSums(hto1), main = "sequenced HTO distribution", horiz=TRUE)

rowSums(hto1)
## Spleen-MP Spleen-M Spleen-ctrl Spleen-P Thymus-MP Thymus-M
## 688432 206663 265412 662165 196262 117402
## Thymus-ctrl Thymus-P
## 156856 562594
Demultiplexing HTO
Demultiplex cells based on HTO enrichment
Demultiplexing results
Cells classification
datatable(as.matrix(table(hashtag1@meta.data$MULTI_ID)),colnames = "Number of cells")
Violinplot (features)
VlnPlot(hashtag1,features = c("nFeature_RNA"),pt.size = 0.1, log = TRUE, group.by = "MULTI_ID")

Violinplot (HTO counts)
VlnPlot(hashtag1,features = c("nCount_HTO"),pt.size = 0.1, log = TRUE, group.by = "MULTI_ID")

tSNEs based on HTO
# Calculate a distance matrix using HTO
hto.dist.mtx <- as.matrix(dist(t(GetAssayData(object = hashtag1, assay = "HTO"))))
# Calculate tSNE embeddings with a distance matrix
hashtag1 <- RunTSNE(hashtag1, distance.matrix = hto.dist.mtx, perplexity = 100)

HTO margin
Tsne<-data.frame(
tSNE_1 = hashtag1@reductions$tsne@cell.embeddings[,1],
tSNE_2= hashtag1@reductions$tsne@cell.embeddings[,2],
gene= hashtag1@meta.data$HTO_margin
)
HTO= hashtag1@meta.data$MULTI_ID
Max=max(hashtag1@meta.data$HTO_margin)
Min=min(hashtag1@meta.data$HTO_margin)
ggplot(Tsne,aes(x=tSNE_1,y=tSNE_2))+geom_point(aes(color=gene,shape=HTO))+
scale_colour_gradient2(low = "blue",mid="orange",high="red",name="HTO margin",midpoint=(Max+Min)/2)+scale_shape_manual(values = c(15,16,17,18,19,20,21,22,23,24,25))

Ridge plots
Visualize enrichment for selected HTOs with ridge plots
RidgePlot(hashtag1, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[1:2],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag1, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[3:4],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag1, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[5:6],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag1, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[7:8],ncol = 2, group.by = "MULTI_ID")

Mitochondrial percentage versus nFeatures
df<-data.frame(multi.id=Seurat1@misc$old_meta_data$MULTI_ID,percent.mito=Seurat1@misc$old_meta_data$percent.mito,nFeature_RNA=Seurat1@misc$old_meta_data$nFeature_RNA)
ggplotly(ggplot(df,aes(x=nFeature_RNA,y=percent.mito,color=multi.id))+geom_point())
UMAP
ggplotly(DimPlot(Seurat1, reduction = "umap", group.by = "MULTI_ID", do.label = TRUE, pt.size = 1))
Loading the second experiment
par(mfrow=c(1,1))
par(las=2)
par(mar=c(5,15,3,3))
barplot(rowSums(hto2), main = "sequenced HTO distribution", horiz=TRUE)

rowSums(hto2)
## Spleen-MP Spleen-M Spleen-ctrl Spleen-P Thymus-MP Thymus-M
## 3569690 1668124 929963 3251282 484276 749822
## Thymus-ctrl Thymus-P
## 310711 1203239
Demultiplexing results
Cells classification
datatable(as.matrix(table(hashtag2@meta.data$MULTI_ID)),colnames = "Number of cells")
Violinplot (features)
VlnPlot(hashtag2,features = c("nFeature_RNA"),pt.size = 0.1, log = TRUE, group.by = "MULTI_ID")

Violin plots (HTO counts)
VlnPlot(hashtag2,features = c("nCount_HTO"),pt.size = 0.1, log = TRUE, group.by = "MULTI_ID")

tSNEs based on HTO
# Calculate a distance matrix using HTO
hto.dist.mtx <- as.matrix(dist(t(GetAssayData(object = hashtag2, assay = "HTO"))))
# Calculate tSNE embeddings with a distance matrix
hashtag2 <- RunTSNE(hashtag2, distance.matrix = hto.dist.mtx, perplexity = 100)
DimPlot(hashtag2, group.by = "MULTI_ID")

HTO margin
Tsne<-data.frame(
tSNE_1 = hashtag2@reductions$tsne@cell.embeddings[,1],
tSNE_2= hashtag2@reductions$tsne@cell.embeddings[,2],
gene= hashtag2@meta.data$HTO_margin
)
HTO= hashtag2@meta.data$MULTI_ID
Max=max(hashtag2@meta.data$HTO_margin)
Min=min(hashtag2@meta.data$HTO_margin)
ggplot(Tsne,aes(x=tSNE_1,y=tSNE_2))+geom_point(aes(color=gene,shape=HTO))+
scale_colour_gradient2(low = "blue",mid="orange",high="red",name="HTO margin",midpoint=(Max+Min)/2)+scale_shape_manual(values = c(15,16,17,18,19,20,21,22,23,24,25))

Ridge plots
Visualize enrichment for selected HTOs with ridge plots
RidgePlot(hashtag2, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[1:2],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag2, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[3:4],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag2, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[5:6],ncol = 2, group.by = "MULTI_ID")

RidgePlot(hashtag2, assay = "HTO", features = rownames(GetAssayData(hashtag1,assay = "HTO"))[7:8],ncol = 2, group.by = "MULTI_ID")

Sample Information
The analysis will be run on the sample 2 (190211).
During the sample loading, we filter cells that do not pass the following filters.
Used parameters in the Seurat CreateSeuratObject function: * min.genes: 3 . Include cells where at least 3 genes are detected * min.cells: 200 . Include genes with detected expression in at least 200 cells
After those filters, the remaining cell number is `r length(colnames(hashtag2@assays$RNA@data)).
#add Exp2 cell identity
HTO_cr2 <- row.names(subset(hashtag2@meta.data, MULTI_ID == "Spleen-ctrl" ))
HTO_ct2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Thymus-ctrl" ))
HTO_mr2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Spleen-M" ))
HTO_mt2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Thymus-M" ))
HTO_pr2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Spleen-P" ))
HTO_pt2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Thymus-P" ))
HTO_pmr2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Spleen-MP" ))
HTO_pmt2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Thymus-MP" ))
HTO_d2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Doublet" ))
HTO_n2 <- row.names(subset(hashtag2@meta.data, MULTI_ID== "Negative" ))
HTO_thymus2 = c(HTO_ct2,HTO_mt2,HTO_pt2,HTO_pmt2)
HTO_spleen2 = c(HTO_cr2,HTO_mr2,HTO_pr2,HTO_pmr2)
HTO_identified2 = c(HTO_thymus2, HTO_spleen2)
# Create a Seurat object without doublet and unassigned cells (remove "negative", "doublet" & "nothing"))
clean.subset2 <- subset(x = hashtag2, cells = HTO_identified2)
VlnPlot(clean.subset2,features = c("nFeature_RNA", "nCount_RNA"),pt.size = 0.1, log = TRUE, group.by = "MULTI_ID")

After removing doublets and negative cells, the remaining cell number is `r length(colnames(clean.subset2@assays$RNA@data)).
Adding ADT
# Load in the UMI matrix
umi <- GetAssayData(object = clean.subset2, slot = "counts")
# Load in the ADT count matrix
raw.adt <- Read10X(PATH_ADT_DATA2, gene.column = 1)
adt <- raw.adt[c(1:6),]
rownames(adt) <- c("CD4","CD5","CD8","CD25","CD44","CD69")
#create an empty matrix containing NAs
Cell.list <- colnames(GetAssayData(object = clean.subset2[["RNA"]], slot = "data" ) )
ADT.list <- c(unique(rownames(adt)))
mat.adt <- matrix(nrow = length(ADT.list), ncol = length(Cell.list))
rownames(mat.adt) = ADT.list
colnames(mat.adt) = Cell.list
# Get cell barcodes detected by both RNA and ADT
joint_bcs <- intersect(colnames(umi),colnames(adt))
adt <- as.matrix(adt[,joint_bcs])
# Fill the empty matrix with values when existing
mat.adt[,joint_bcs]<-adt[,joint_bcs]
# Add ADT data as a new assay independent from RNA
clean.subset2[["ADT"]] <- CreateAssayObject(counts = mat.adt[,colnames(clean.subset2)])
# Normalize ADT data, here we use centered log-ratio (CLR) transformation
clean.subset2 <- NormalizeData(clean.subset2, assay = "ADT", normalization.method = "CLR")
#Scale
clean.subset2 <- ScaleData(clean.subset2, assay = "ADT")
ADT list :
print (rownames(adt))
[1] “CD4” “CD5” “CD8” “CD25” “CD44” “CD69”
Mitochondrial percentage versus nFeatures
df<-data.frame(multi.id=Seurat2@misc$old_meta_data$MULTI_ID,percent.mito=Seurat2@misc$old_meta_data$percent.mito,nFeature_RNA=Seurat2@misc$old_meta_data$nFeature_RNA)
ggplotly(ggplot(df,aes(x=nFeature_RNA,y=percent.mito,color=multi.id))+geom_point())
UMAP:
ggplotly(DimPlot(Seurat2, reduction = "umap", group.by = "MULTI_ID", do.label = TRUE, pt.size = 1))
Analysis part
UMAP and clustering parameter
T-cell selection
According to T-cell markers we will exclude Cd3d low clusters: 13 (Bcells), 11, 14, 17 (monocytes/macrophages). According to T-cell markers we will exclude Cd3d/Cd3e low clusters: 11 (Bcells), 13, 17, 18, 19 (monocytes/macrophages), 16, 14 (ILC/NK).
re clustering

T-cell umaps
clustering

END OF PREPROCESSING
We obtain the final object with clustering to start the analysis
sessionInfo()
## R version 3.5.3 (2019-03-11)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.5 LTS
##
## Matrix products: default
## BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.18.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] knitr_1.23 RColorBrewer_1.1-2 magrittr_1.5
## [4] dplyr_0.8.1 DT_0.6.2 gridExtra_2.3
## [7] kableExtra_1.1.0 plotly_4.9.0 ggplot2_3.1.1
## [10] Seurat_3.0.1
##
## loaded via a namespace (and not attached):
## [1] nlme_3.1-140 tsne_0.1-3 bitops_1.0-6
## [4] webshot_0.5.1 httr_1.4.0 sctransform_0.2.0
## [7] tools_3.5.3 R6_2.4.0 irlba_2.3.3
## [10] KernSmooth_2.23-15 lazyeval_0.2.2 colorspace_1.4-1
## [13] npsurv_0.4-0 withr_2.1.2 tidyselect_0.2.5
## [16] compiler_3.5.3 rvest_0.3.4 xml2_1.2.0
## [19] labeling_0.3 caTools_1.17.1.2 scales_1.0.0
## [22] lmtest_0.9-37 readr_1.3.1 ggridges_0.5.1
## [25] pbapply_1.4-0 stringr_1.4.0 digest_0.6.19
## [28] rmarkdown_1.12 R.utils_2.8.0 base64enc_0.1-3
## [31] pkgconfig_2.0.2 htmltools_0.3.6 bibtex_0.4.2
## [34] highr_0.8 htmlwidgets_1.3 rlang_0.3.4
## [37] rstudioapi_0.10 shiny_1.3.2 zoo_1.8-5
## [40] jsonlite_1.6 crosstalk_1.0.0 ica_1.0-2
## [43] gtools_3.8.1 R.oo_1.22.0 Matrix_1.2-17
## [46] Rcpp_1.0.1 munsell_0.5.0 ape_5.3
## [49] reticulate_1.12 R.methodsS3_1.7.1 stringi_1.4.3
## [52] yaml_2.2.0 gbRd_0.4-11 MASS_7.3-51.4
## [55] gplots_3.0.1.1 Rtsne_0.15 plyr_1.8.4
## [58] grid_3.5.3 promises_1.0.1 parallel_3.5.3
## [61] gdata_2.18.0 listenv_0.7.0 ggrepel_0.8.1
## [64] crayon_1.3.4 lattice_0.20-38 cowplot_0.9.4
## [67] splines_3.5.3 hms_0.4.2 SDMTools_1.1-221.1
## [70] pillar_1.4.0 igraph_1.2.4.1 future.apply_1.2.0
## [73] reshape2_1.4.3 codetools_0.2-16 glue_1.3.1
## [76] evaluate_0.13 lsei_1.2-0 metap_1.1
## [79] data.table_1.12.2 httpuv_1.5.1 png_0.1-7
## [82] Rdpack_0.11-0 gtable_0.3.0 RANN_2.6.1
## [85] purrr_0.3.2 tidyr_0.8.3 future_1.13.0
## [88] assertthat_0.2.1 xfun_0.7 mime_0.6
## [91] rsvd_1.0.0 xtable_1.8-4 later_0.8.0
## [94] survival_2.44-1.1 viridisLite_0.3.0 tibble_2.1.1
## [97] cluster_2.0.9 globals_0.12.4 fitdistrplus_1.0-14
## [100] ROCR_1.0-7
LS0tCnRpdGxlOiAiUmVwb3J0IEV4cGVyaW1lbnRfUHJlcHJvY2Vzc2luZyIKYXV0aG9yOiAiRGVscGhpbmUgUG90aWVyIC8gTWF0aGlzIE5vemFpcyAvIFNhcmFuIFBhbmthZXciCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci5tYWluLWNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxODAwcHg7CiAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgbWFyZ2luLXJpZ2h0OiBhdXRvOwp9Cjwvc3R5bGU+CgpgYGB7ciBnbG9iYWwtb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZmlnLmFsaWduID0gJ2NlbnRlcicpCmBgYAojIE1ZQy1kZWZpY2llbmN5IGltcGFpcnMgdGhlIGRldmVsb3BtZW50IG9mIGVmZmVjdG9yL21lbW9yeSBUIGx5bXBob2N5dGVzCgpBdXRob3JzIDpNYXRoaXMgTm96YWlzMSosIE1hcmllIExvb3N2ZWxkMSwyKiwgU2FyYW4gUGFua2FldzEsIENsw6ltZW5jZSBHcm9zamVhbjEsIE5vw6ltaWUgR2VudGlsMSwgSnVsaWUgUXVlc3NhZGExLCBDeXJpbGxlIE1pb25uZXQxLCBEZWxwaGluZSBQb3RpZXIxQCAmIERvbWluaXF1ZSBQYXlldC1Cb3JuZXQxQAoKKlRoZXNlIGF1dGhvcnMgY29udHJpYnV0ZWQgZXF1YWxseTogTWF0aGlzIE5vemFpcywgTWFyaWUgTG9vc3ZlbGQ7IEAgQ29ycmVzcG9uZGluZyBhdXRob3JzOiBEciBEZWxwaGluZSBQb3RpZXIgYW5kIERyIERvbWluaXF1ZSBQYXlldC1Cb3JuZXQKCkxpbmsgdG8gYXJ0aWNsZSA6IChUTyBjb21lKQoKSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvbiB0aGlzIGFuYWx5c2lzLCBwbGVhc2UgY29udGFjdCBNYXRoaXMgTm96YWlzIG9yIERlbHBoaW5lIFBvdGllciAoanVzdCBkZWxwaGluZSA/IGNvbnRhY3QgYXV0aG9yKQoKI3RvIGRvIGJlZm9yZSBwdWJsaXNoCmBgYHtyfQojY2hhbmdlIGFsbCBwYXRoIHRvIGRhdGEgc2hvd2luZyBteSBlbnZpcm9ubWVudCAoTkFTLi4uKSBtZXR0cmUgbGllbiDDoCBwYXJ0aXIgZGUgV29ya3NwYWNlIG91IGlsIGRvd2xvYWRlcm9udCBsZXMgZmljaGllciBzb3VyY2UgKGZhc3RxIGV0IG9iamV0IFIpCgojZG8gd2Ugd2FudCB0byBzaG93IHRoZSBjb2RlIGluIHJtZCA/IAoKIyBHTyBtaXNlIGVuIGxpZ25lIGRlcyBmaWNoaWVyIGJydXQKCiN0ZXN0IGZpbmFsIHNhbnMgYXVjdW4gb2JqZXQsIGF2ZWMgbGUgcHJlbWllciBvYmogZXQgYXZlYyBsZSBkZXV4aWVtZQoKI2NoYW5nZSBvdXRwdXQgcGF0aApgYGAKCgoKYGBge3IgZW52X2xvYWRpbmcsIGluY2x1ZGU9RkFMU0V9CiMgTG9hZCBwYWNrYWdlcywgZGF0YSBhbmQgZnVuY3Rpb25zCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KERUKQoKI1BhdGggdG8gdGhlIGFuYWx5c2lzIGZvbGRlcgpXT1JLU1BBQ0UgPC0gIi9ob21lL25vemFpc20vV29ya3NwYWNlLzAxX1RoZXNlLzAxX1Byb2plY3QvTXljX1B0ZW5fUGFwZXIvTXljX3JlcG8vIgojIFBhdGggdG8gdGhlIGZvbGRlciBjb250YWluaW5nIHNjcmlwdHMgdXNlZCBpbiB0aGUgYW5hbHlzaXMKQ1dEIDwtICIvaG9tZS9ub3phaXNtL1dvcmtzcGFjZS9GdW5jdGlvbl9kZWxwaGluZS8iIAojIExvYWQgdGhlIFIgc2NyaXB0cyBjb250YWluaW5nIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYW5hbHlzaXMKc291cmNlKHBhc3RlKENXRCwgIldvcmtmbG93X2Z1bmN0aW9uc19TMy5SIiwgc2VwPSIvIikpCiMgIFBhdGggdG8gdGhlIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiBvdXRwdXQgb2JqZWN0cwojT1VUUFVUX1BBVEggPC0gKHBhc3RlMChXT1JLU1BBQ0UsIjAyX1NldXJhdF9hbmFseXNpcy8wMl9PdXRwdXQvIikpCk9VVFBVVF9QQVRIIDwtICgiL2hvbWUvbm96YWlzbS9Xb3Jrc3BhY2UvMDFfVGhlc2UvMDFfUHJvamVjdC9NeWNfUHRlbl9QYXBlci9PdXRwdXRfcmVwby8iKQojIFNldCB0aGUgcmFuZG9tIG51bWJlciBzZWVkCnNldC5zZWVkKDEyMzQpCiMgUmVzb2x1dGlvbiBwYXJhbWV0ZXIgZm9yIFNldXJhdCBjbHVzdGVyaW5nClJFU09MVVRJT04gPC0gMQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLHJlc3VsdHM9J2FzaXMnfQpTQU1QTEUxIDwtICJyZXBsaWNhdGUxIgpTQU1QTEUyIDwtICJyZXBsaWNhdGUyIgoKaWYoKCEgZmlsZS5leGlzdHMocGFzdGUwKE9VVFBVVF9QQVRILCAiU2V1cmF0X2NsZWFuLXN1YnNldF90b21lcmdlXyIsIFNBTVBMRTEsICIuUm9iaiIpKSkgfCAoISBmaWxlLmV4aXN0cyhwYXN0ZTAoT1VUUFVUX1BBVEgsICJTZXVyYXRfY2xlYW4tc3Vic2V0X3RvbWVyZ2VfIiwgU0FNUExFMiwgIi5Sb2JqIikpKSl7CnByaW50KCJZb3UgYXJlIHN0YXJ0aW5nIHRoZSBhbmFseXNpcyBmcm9tIGNvdW50IG1hdHJpeCBvYnRhaW4gd2l0aCBDZWxsUmFuZ2VyIGFuZCBDaXRlLXNlcS1jb3VudCIpCnBhcnQxIDwtIFRSVUUgI2V4cGVyaW1lbnQgb25lIGJ5IG9uZQpwYXJ0MiA8LSBUUlVFICNtZXJnaW5nIDIgb2JqZWN0Cn1lbHNlIGlmKCBmaWxlLmV4aXN0cyhwYXN0ZTAoT1VUUFVUX1BBVEgsICJULVNldXJhdC1tZXJnZWRfY2xlYW4tc3Vic2V0IiwiLlJvYmoiKSkpewpwcmludCgiWW91IGFscmVhZHkgaGF2ZSB0aGUgZmluYWwgb2JqZWN0IG9mIHByZXByb2Nlc3NpbmcsIHlvdSBjYW4gbm93IGxhdWNoIHRoZSBFeHBlcmltZW50X2FuYWx5c2lzIHNjcmlwdCIpCnBhcnQxIDwtIEZBTFNFCnBhcnQyIDwtIEZBTFNFCn1lbHNleyAKcHJpbnQgKCJZb3UgYXJlIHN0YXJ0aW5nIGFuYWx5c2lzIGZyb20gb3VyIHR3byByZXBsaWNhdGUgUm9iaiBpbiBvcmRlciB0byBkbyB0aGUgaW50ZWdyYXRpb24iKQpwYXJ0MSA8LSBGQUxTRQpwYXJ0MiA8LSBUUlVFCn0KCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyBMb2FkaW5nIHRoZSBmaXJzdCBleHBlcmltZW50CmBgYAoKCmBgYHtyIHBhdGgxX2xvYWRpbmcsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSApfQojIExvYWQgcGF0aCBmb3IgZmlsZXMKUEFUSF9NT1VTRV9EQVRBMSA8LSAiL21udC9OQVM2L0JObGFiL1NhcmFuL1JlcnVuX0NlbGxSYW5nZXIvTVlDX1BURU5fMDFfbW0xMC9vdXRzL2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4LyIKUFJPSkVDVF9OQU1FMSA8LSBwYXN0ZSgiMTBYXyIsIFNBTVBMRTEsIHNlcCA9ICIiKQpQQVRIX0hUT19EQVRBMSA8LSAiL21udC9OQVM1L0JObGFiL2RlbHBoaW5lL2JhcmVjb2RlZF9zY1JOQXNlcS9NWUNfUFRFTi9DSVRFLXNlcS1jb3VudF8xODEwMzFfUmVzdWx0X2hkMi91bWlfY291bnQvIgpgYGAKCmBgYHtyIFNhbXBsZTFfbG9hZGluZywgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KIyBDcmVhdGUgU2V1cmF0IG9iamVjdCBhbmQgYXBwbHkgZmlsdGVyaW5nICAgCiMgUmVhZCAxMFggZGF0YQptb3VzZV9kYXRhMSA8LSBSZWFkMTBYKGRhdGEuZGlyID0gUEFUSF9NT1VTRV9EQVRBMSkKCiMgQ3JlYXRlIHRoZSBTZXVyYXQgb2JqZWN0IGFuZCBmaXJzdCBmaWx0ZXIKTm90X3Byb2Nlc3NlZF9TZXVyYXRfbTEgPC0gQ3JlYXRlU2V1cmF0T2JqZWN0KGNvdW50cyA9IG1vdXNlX2RhdGExLCBtaW4uY2VsbHMgPSAzLCBtaW4uZmVhdHVyZXMgPSAyMDAsIHByb2plY3QgPSAiMTgxMDMxIikKYGBgCgpgYGB7ciBIVE8xX2xvYWRpbmcsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSl9CiMgTG9hZCBpbiB0aGUgVU1JIG1hdHJpeAp1bWlfc3BhcnNlMSA8LSBHZXRBc3NheURhdGEob2JqZWN0ID0gTm90X3Byb2Nlc3NlZF9TZXVyYXRfbTEsIHNsb3QgPSAiY291bnRzIikKCiMgTG9hZCBpbiB0aGUgSFRPIGNvdW50IG1hdHJpeApyYXcuaHRvMSA8LSBSZWFkMTBYKFBBVEhfSFRPX0RBVEExLCBnZW5lLmNvbHVtbiA9IDEpCmh0bzEgPC0gcmF3Lmh0bzFbYygxOjgpLF0KCnJvd25hbWVzKGh0bzEpIDwtIGMoIlNwbGVlbi1NUCIsIlNwbGVlbi1NIiwiU3BsZWVuLWN0cmwiLCJTcGxlZW4tUCIsIlRoeW11cy1NUCIsIlRoeW11cy1NIiwiVGh5bXVzLWN0cmwiLCJUaHltdXMtUCIpCgojIFNlbGVjdCBjZWxsIGJhcmNvZGVzIGRldGVjdGVkIGJ5IGJvdGggUk5BIGFuZCBIVE8KIyBJbiB0aGUgZXhhbXBsZSBkYXRhc2V0cyB3ZSBoYXZlIGFscmVhZHkgZmlsdGVyZWQgdGhlIGNlbGxzIGZvciB5b3UsIGJ1dCBwZXJmb3JtIHRoaXMgc3RlcCBmb3IgY2xhcml0eS4Kam9pbnRfYmNzMSA8LSBpbnRlcnNlY3QoY29sbmFtZXModW1pX3NwYXJzZTEpLGNvbG5hbWVzKGh0bzEpKQoKIyBTdWJzZXQgUk5BIGFuZCBIVE8gY291bnRzIGJ5IGpvaW50IGNlbGwgYmFyY29kZXN1bWlfc3BhcnNlIDwtIHBibWNfdW1pX3NwYXJzZVssam9pbnRfYmNzXQpodG8xIDwtIGFzLm1hdHJpeChodG8xWyxqb2ludF9iY3MxXSkKCiMgQ29uZmlybSB0aGF0IHRoZSBIVE8gaGF2ZSB0aGUgY29ycmVjdCBuYW1lcwpwcmludCAocm93bmFtZXMoaHRvMSkpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KTG9va2luZyB0byBIVE8gZGlzdHJpYnV0aW9uIGFjY3Jvc3Mgc2FtcGxlIDoKYGBgCgpgYGB7ciBIVE8gZGlzdHJpYnV0aW9uLGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KI0hUTyBkaXN0cmlidXRpb24KcGFyKG1mcm93PWMoMSwxKSkKcGFyKGxhcz0yKQpwYXIobWFyPWMoNSwxNSwzLDMpKQpiYXJwbG90KHJvd1N1bXMoaHRvMSksIG1haW4gPSAic2VxdWVuY2VkIEhUTyBkaXN0cmlidXRpb24iLCBob3Jpej1UUlVFKQpyb3dTdW1zKGh0bzEpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSl9CiMjIyBTZXR1cCBzZXVyYXQgb2JqZWN0IGFuZCBhZGQgaW4gdGhlIGh0byBkYXRhCiMgU2V0dXAgU2V1cmF0IG9iamVjdApoYXNodGFnMSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gdW1pX3NwYXJzZTFbLGpvaW50X2JjczFdLCBhc3NheSA9ICJSTkEiLCBwcm9qZWN0ID0gIjE4MTAzMSIpCgojIE5vcm1hbGl6ZSBSTkEgZGF0YSB3aXRoIGxvZyBub3JtYWxpemF0aW9uCmhhc2h0YWcxIDwtIE5vcm1hbGl6ZURhdGEoaGFzaHRhZzEsZGlzcGxheS5wcm9ncmVzcyA9IEZBTFNFKQojIEZpbmQgYW5kIHNjYWxlIHZhcmlhYmxlIGdlbmVzCmhhc2h0YWcxIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGhhc2h0YWcxLCBwYXJ0MS5wbG90ID0gRiwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwLCBkaXNwbGF5LnByb2dyZXNzID0gRkFMU0UpCmhhc2h0YWcxIDwtIFNjYWxlRGF0YShoYXNodGFnMSxnZW5lcy51c2UgPSBoYXNodGFnMUB2YXIuZmVhdHVyZXMsZGlzcGxheS5wcm9ncmVzcyA9IEZBTFNFKQpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFLGV2YWw9KHBhcnQxID09IFRSVUUpfQojIyMgQWRkaW5nIEhUTyBkYXRhIGFzIGFuIGluZGVwZW5kZW50IGFzc2F5CgojIEFkZCBIVE8gZGF0YSBhcyBhIG5ldyBhc3NheSBpbmRlcGVuZGVudCBmcm9tIFJOQQpoYXNodGFnMVtbIkhUTyJdXSA8LSBDcmVhdGVBc3NheU9iamVjdChjb3VudHMgPSBodG8xKQpoYXNodGFnMSA8LSBTZXRBc3NheURhdGEoaGFzaHRhZzEsYXNzYXkgPSAiSFRPIixzbG90ID0gImNvdW50cyIsbmV3LmRhdGEgPSBodG8xKQojIE5vcm1hbGl6ZSBIVE8gZGF0YSwgaGVyZSB3ZSB1c2UgY2VudGVyZWQgbG9nLXJhdGlvIChDTFIpIHRyYW5zZm9ybWF0aW9uCmhhc2h0YWcxIDwtIE5vcm1hbGl6ZURhdGEoaGFzaHRhZzEsIGFzc2F5ID0gIkhUTyIsbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiQ0xSIixkaXNwbGF5LnByb2dyZXNzID0gRkFMU0UpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyBEZW11bHRpcGxleGluZyBIVE8KRGVtdWx0aXBsZXggY2VsbHMgYmFzZWQgb24gSFRPIGVucmljaG1lbnQKYGBgCgpgYGB7ciBEZW11bHRpcGxleGluZywgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KCiNSdW4gSFRPZGVtdXgganVzdCB0byBnZXQgdGhlIEhUT21heF9JRCBmaWVkCmhhc2h0YWcxIDwtIEhUT0RlbXV4KGhhc2h0YWcxLCBhc3NheSA9ICJIVE8iLCBwb3NpdGl2ZS5xdWFudGlsZSA9IDAuOTksIHZlcmJvc2UgPSBGQUxTRSkKI0hlcmUgd2UgdXNlIHRoZSBTZXVyYXQgZnVuY3Rpb24gTVVMVElzZXFEZW11eCgpIHRvIGFzc2lnbiBzaW5nbGUgY2VsbHMgYmFjayB0byB0aGVpciBzYW1wbGUgb3JpZ2lucy4KaGFzaHRhZzEgPC0gTVVMVElzZXFEZW11eChoYXNodGFnMSwgYXNzYXkgPSAiSFRPIixhdXRvVGhyZXNoID0gVFJVRSwgbWF4aXRlciA9IDEwLHFyYW5nZSA9IHNlcShmcm9tID0gMC4xLCB0byA9IDAuOSwgYnkgPSAwLjA1KSwgdmVyYm9zZSA9IFRSVUUpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojI0RlbXVsdGlwbGV4aW5nIHJlc3VsdHMgey50YWJzZXR9CmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyNDZWxscyBjbGFzc2lmaWNhdGlvbgpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KZGF0YXRhYmxlKGFzLm1hdHJpeCh0YWJsZShoYXNodGFnMUBtZXRhLmRhdGEkTVVMVElfSUQpKSxjb2xuYW1lcyA9ICJOdW1iZXIgb2YgY2VsbHMiKQpgYGAKCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIyBWaW9saW5wbG90IChmZWF0dXJlcykKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQpWbG5QbG90KGhhc2h0YWcxLGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIikscHQuc2l6ZSA9IDAuMSwgbG9nID0gVFJVRSwgIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIyBWaW9saW5wbG90IChIVE8gY291bnRzKQpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClZsblBsb3QoaGFzaHRhZzEsZmVhdHVyZXMgPSBjKCJuQ291bnRfSFRPIikscHQuc2l6ZSA9IDAuMSwgbG9nID0gVFJVRSwgIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIHRTTkVzIGJhc2VkIG9uIEhUTwpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CiMgQ2FsY3VsYXRlIGEgZGlzdGFuY2UgbWF0cml4IHVzaW5nIEhUTwpodG8uZGlzdC5tdHggPC0gYXMubWF0cml4KGRpc3QodChHZXRBc3NheURhdGEob2JqZWN0ID0gaGFzaHRhZzEsIGFzc2F5ID0gIkhUTyIpKSkpCgojIENhbGN1bGF0ZSB0U05FIGVtYmVkZGluZ3Mgd2l0aCBhIGRpc3RhbmNlIG1hdHJpeApoYXNodGFnMSA8LSBSdW5UU05FKGhhc2h0YWcxLCBkaXN0YW5jZS5tYXRyaXggPSBodG8uZGlzdC5tdHgsIHBlcnBsZXhpdHkgPSAxMDApCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KRGltUGxvdChoYXNodGFnMSwgZ3JvdXAuYnkgPSAiTVVMVElfSUQiLHJlZHVjdGlvbiA9ICJ0c25lIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIyBIVE8gbWFyZ2luCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gNywgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClRzbmU8LWRhdGEuZnJhbWUoCiAgdFNORV8xID0gaGFzaHRhZzFAcmVkdWN0aW9ucyR0c25lQGNlbGwuZW1iZWRkaW5nc1ssMV0sCiAgdFNORV8yPSBoYXNodGFnMUByZWR1Y3Rpb25zJHRzbmVAY2VsbC5lbWJlZGRpbmdzWywyXSwKICBnZW5lPSBoYXNodGFnMUBtZXRhLmRhdGEkSFRPX21hcmdpbgopCgpIVE89IGhhc2h0YWcxQG1ldGEuZGF0YSRNVUxUSV9JRApNYXg9bWF4KGhhc2h0YWcxQG1ldGEuZGF0YSRIVE9fbWFyZ2luKQpNaW49bWluKGhhc2h0YWcxQG1ldGEuZGF0YSRIVE9fbWFyZ2luKQpnZ3Bsb3QoVHNuZSxhZXMoeD10U05FXzEseT10U05FXzIpKStnZW9tX3BvaW50KGFlcyhjb2xvcj1nZW5lLHNoYXBlPUhUTykpKwogICAgICAgICAgIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93ID0gImJsdWUiLG1pZD0ib3JhbmdlIixoaWdoPSJyZWQiLG5hbWU9IkhUTyBtYXJnaW4iLG1pZHBvaW50PShNYXgrTWluKS8yKStzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSkpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyMgUmlkZ2UgcGxvdHMKCioqVmlzdWFsaXplIGVucmljaG1lbnQgZm9yIHNlbGVjdGVkIEhUT3Mgd2l0aCByaWRnZSBwbG90cyoqCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNCwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClJpZGdlUGxvdChoYXNodGFnMSwgYXNzYXkgPSAiSFRPIiwgZmVhdHVyZXMgPSByb3duYW1lcyhHZXRBc3NheURhdGEoaGFzaHRhZzEsYXNzYXkgPSAiSFRPIikpWzE6Ml0sbmNvbCA9IDIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKUmlkZ2VQbG90KGhhc2h0YWcxLCBhc3NheSA9ICJIVE8iLCBmZWF0dXJlcyA9IHJvd25hbWVzKEdldEFzc2F5RGF0YShoYXNodGFnMSxhc3NheSA9ICJIVE8iKSlbMzo0XSxuY29sID0gMiwgZ3JvdXAuYnkgPSAiTVVMVElfSUQiKQpSaWRnZVBsb3QoaGFzaHRhZzEsIGFzc2F5ID0gIkhUTyIsIGZlYXR1cmVzID0gcm93bmFtZXMoR2V0QXNzYXlEYXRhKGhhc2h0YWcxLGFzc2F5ID0gIkhUTyIpKVs1OjZdLG5jb2wgPSAyLCBncm91cC5ieSA9ICJNVUxUSV9JRCIpClJpZGdlUGxvdChoYXNodGFnMSwgYXNzYXkgPSAiSFRPIiwgZmVhdHVyZXMgPSByb3duYW1lcyhHZXRBc3NheURhdGEoaGFzaHRhZzEsYXNzYXkgPSAiSFRPIikpWzc6OF0sbmNvbCA9IDIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQojIyBTYW1wbGUgSW5mb3JtYXRpb24KClRoZSBhbmFseXNpcyB3aWxsIGJlIHJ1biBvbiB0aGUgc2FtcGxlIDEgKDE4MTAzMSkuCgpEdXJpbmcgdGhlIHNhbXBsZSBsb2FkaW5nLCB3ZSBmaWx0ZXIgY2VsbHMgdGhhdCBkbyBub3QgcGFzcyB0aGUgZm9sbG93aW5nIGZpbHRlcnMuICAgCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZSBwYXJhbWV0ZXJzIGluIHRoZSBTZXVyYXQgKkNyZWF0ZVNldXJhdE9iamVjdCogZnVuY3Rpb246CiAgCiogbWluLmdlbmVzOiBJbmNsdWRlIGNlbGxzIHdoZXJlIGF0IGxlYXN0IDIwMCBnZW5lcyBhcmUgZGV0ZWN0ZWQKKiBtaW4uY2VsbHM6IEluY2x1ZGUgZ2VuZXMgd2l0aCBkZXRlY3RlZCBleHByZXNzaW9uIGluIGF0IGxlYXN0IDMgY2VsbHMKCkFmdGVyIHRob3NlIGZpbHRlcnMsIHRoZSByZW1haW5pbmcgY2VsbCBudW1iZXIgaXMgKipgbGVuZ3RoKGNvbG5hbWVzKGhhc2h0YWcxQGFzc2F5cyRSTkFAZGF0YSkpYCoqLgpgYGAKCmBgYHtyIGRvdWJsZXRfbmVnYXRpdmVfcmVtb3ZhbCwgcmVzdWx0cz0nYXNpcycsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQojYWRkIEV4cDEgY2VsbCBpZGVudGl0eQpIVE9fY3IxIDwtIHJvdy5uYW1lcyhzdWJzZXQoaGFzaHRhZzFAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiU3BsZWVuLWN0cmwiICkpCkhUT19jdDEgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMUBtZXRhLmRhdGEsIE1VTFRJX0lEID09ICJUaHltdXMtY3RybCIgKSkKSFRPX21yMSA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1NIiApKQpIVE9fbXQxIDwtIHJvdy5uYW1lcyhzdWJzZXQoaGFzaHRhZzFAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiVGh5bXVzLU0iICkpCkhUT19wcjEgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMUBtZXRhLmRhdGEsIE1VTFRJX0lEID09ICJTcGxlZW4tUCIgKSkKSFRPX3B0MSA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1QIiApKQpIVE9fcG1yMSA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1NUCIgKSkKSFRPX3BtdDEgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMUBtZXRhLmRhdGEsIE1VTFRJX0lEID09ICJUaHltdXMtTVAiICkpCkhUT19kMSA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIkRvdWJsZXQiICkpCkhUT19uMSA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIk5lZ2F0aXZlIiApKQoKSFRPX3RoeW11czEgPSBjKEhUT19jdDEsSFRPX210MSxIVE9fcHQxLEhUT19wbXQxKQpIVE9fc3BsZWVuMSA9IGMoSFRPX2NyMSxIVE9fbXIxLEhUT19wcjEsSFRPX3BtcjEpCkhUT19pZGVudGlmaWVkMSA9IGMoSFRPX3RoeW11czEsIEhUT19zcGxlZW4xKQoKCiMgQ3JlYXRlIGEgU2V1cmF0IG9iamVjdCB3aXRob3V0IGRvdWJsZXQgYW5kIHVuYXNzaWduZWQgY2VsbHMgKHJlbW92ZSAibmVnYXRpdmUiLCAiZG91YmxldCIgJiAibm90aGluZyIpKQpjbGVhbi5zdWJzZXQxIDwtIHN1YnNldCh4ID0gaGFzaHRhZzEsIGNlbGxzID0gSFRPX2lkZW50aWZpZWQxKQpWbG5QbG90KGNsZWFuLnN1YnNldDEsZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIpLHB0LnNpemUgPSAwLjEsIGxvZyA9IFRSVUUsICBncm91cC5ieSA9ICJNVUxUSV9JRCIpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQpBZnRlciByZW1vdmluZyBkb3VibGV0cyBhbmQgbmVnYXRpdmUgY2VsbHMsIHRoZSByZW1haW5pbmcgY2VsbCBudW1iZXIgaXMgKipgciBsZW5ndGgoY29sbmFtZXMoY2xlYW4uc3Vic2V0MUBhc3NheXMkUk5BQGRhdGEpKSoqLgpgYGAKCgpgYGB7ciBwcm9jZXNzaW5nXzEsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSl9CiMgT0JKRUNUIE9ORSBQUk9DRVNTSU5HIEFORCBTQVZFCiMxLSBRQyAKU2V1cmF0MSA8LSBRQ19mdW5jdGlvbl9taXRvX3RocmVzaG9sZChTZXVyYXQgPSBjbGVhbi5zdWJzZXQxLCBtaXRvX3RocmVzaG9sZCA9IDAuMSwgZG9fcGxvdCA9IEZBTFNFKQogIAojMi0gRmluZCB2YXJpYWJsZSBnZW5lcwpTZXVyYXQxIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKG9iamVjdCA9IFNldXJhdDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiUk5BIiwgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCBkby5wbG90PVRSVUUpCgpTZXVyYXQxIDwtIFNjYWxlRGF0YShTZXVyYXQxLCAKICAgICAgICAgICAgICAgICAgICAgICBhc3NheT0iUk5BIiwKICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICNkby5zY2FsZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICBkby5jZW50ZXIgPSBUUlVFKQogIApTZXVyYXQxIDwtIFJ1blBDQShvYmplY3QgPSBTZXVyYXQxLAogICAgICAgICAgICAgICAgICAgIGFzc2F5ID0gIlJOQSIsCiAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCAjaWYgVFJVRSBwcmludCB0aGUgdG9wIGdlbmVzIGZvciBlYWNoIFBDCiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSAgVmFyaWFibGVGZWF0dXJlcyhvYmplY3QgPSBTZXVyYXQxKSwgCiAgICAgICAgICAgICAgICAgICAgc2VlZC51c2UgPSAxMjM0LAogICAgICAgICAgICAgICAgICAgIG5wY3MgPSA1MCkgIyBzdXIgbGVzIDUwIHByZW1pZXJlcyBjb21wb3NhbnRlcwogIApFbGJvd1Bsb3QoU2V1cmF0MSwgbmRpbXMgPSA1MCwgcmVkdWN0aW9uID0gInBjYSIpCiAgClNldXJhdDEgPC0gUHJvamVjdERpbShvYmplY3QgPSBTZXVyYXQxLAogICAgICAgICAgICAgICAgICAgICAgICBuZmVhdHVyZXMucHJpbnQgPSAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgZGltcy5wcmludCA9IDE6MTApCiAgClNldXJhdDEgPC0gUnVuVFNORShvYmplY3QgPSBTZXVyYXQxLAogICAgICAgICAgICAgICAgICAgICBkby5mYXN0ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgIHNlZWQudXNlID0gMTIzNCwKICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6MjAsICMgVXNlcyAyMCBmaXJzdCBQQ3MKICAgICAgICAgICAgICAgICAgICAgcGVycGxleGl0eSA9IDQwKQogIApTZXVyYXQxIDwtIEZpbmROZWlnaGJvcnMob2JqZWN0ID0gU2V1cmF0MSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjIwICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLnJlY2FsYyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAicGNhIikKClNldXJhdDEgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IFNldXJhdDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBSRVNPTFVUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEyMzQpClNldXJhdDEgPC0gUnVuVU1BUChvYmplY3QgPSBTZXVyYXQxLCByZWR1Y3Rpb24gPSAicGNhIiwgc2VlZC51c2UgPSAxMjM0LCBkaW1zID0gMToyMCkKICAKc2F2ZShTZXVyYXQxLCBmaWxlID0gcGFzdGUwKE9VVFBVVF9QQVRILCAiU2V1cmF0X2NsZWFuLXN1YnNldF90b21lcmdlXyIsIFNBTVBMRTEsICIuUm9iaiIpKQpgYGAKCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIE1pdG9jaG9uZHJpYWwgcGVyY2VudGFnZSB2ZXJzdXMgbkZlYXR1cmVzCmBgYAoKYGBge3IgbWl0b192c19uZmVhdHVyZXMsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQpkZjwtZGF0YS5mcmFtZShtdWx0aS5pZD1TZXVyYXQxQG1pc2Mkb2xkX21ldGFfZGF0YSRNVUxUSV9JRCxwZXJjZW50Lm1pdG89U2V1cmF0MUBtaXNjJG9sZF9tZXRhX2RhdGEkcGVyY2VudC5taXRvLG5GZWF0dXJlX1JOQT1TZXVyYXQxQG1pc2Mkb2xkX21ldGFfZGF0YSRuRmVhdHVyZV9STkEpCmdncGxvdGx5KGdncGxvdChkZixhZXMoeD1uRmVhdHVyZV9STkEseT1wZXJjZW50Lm1pdG8sY29sb3I9bXVsdGkuaWQpKStnZW9tX3BvaW50KCkpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgVU1BUApgYGAKCmBgYHtyIFVNQVBfSFRPX3NldXJhdF8xLGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KZ2dwbG90bHkoRGltUGxvdChTZXVyYXQxLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIiwgZG8ubGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMSkpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojIExvYWRpbmcgdGhlIHNlY29uZCBleHBlcmltZW50CmBgYAoKCmBgYHtyIHBhdGgyX2xvYWRpbmcsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSl9CiMgTG9hZCBwYXRoIGZvciBmaWxlcwpQQVRIX01PVVNFX0RBVEEyIDwtICIvbW50L05BUzYvQk5sYWIvU2FyYW4vUmVydW5fQ2VsbFJhbmdlci9NWUNfUFRFTl8wMl9tbTEwL291dHMvZmlsdGVyZWRfZmVhdHVyZV9iY19tYXRyaXgvIgpQUk9KRUNUX05BTUUyIDwtIHBhc3RlKCIxMFhfIiwgU0FNUExFMiwgc2VwID0gIiIpClBBVEhfSFRPX0RBVEEyIDwtICIvbW50L05BUzYvQk5sYWIvbWF0aGlzL3NjUk5Bc2VxL0RNQVRoMy9DSVRFLXNlcS1jb3VudDE0MV8xOTAyMTFfUmVzdWx0X2hhc2h0YWdfaGQyL3VtaV9jb3VudC8iClBBVEhfQURUX0RBVEEyIDwtICIvbW50L05BUzUvQk5sYWIvZGVscGhpbmUvYmFyZWNvZGVkX3NjUk5Bc2VxL01ZQ19QVEVOMi9DSVRFLXNlcS1jb3VudDE0MV8xOTAyMTFfQURULVJlc3VsdF9oZDIvdW1pX2NvdW50IgpgYGAKCmBgYHtyIFNhbXBsZV9sb2FkaW5nXzIsIGluY2x1ZGU9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSl9CiMgQ3JlYXRlIFNldXJhdCBvYmplY3QgYW5kIGFwcGx5IGZpbHRlcmluZyAgIAojIFJlYWQgMTBYIGRhdGEKbW91c2VfZGF0YTIgPC0gUmVhZDEwWChkYXRhLmRpciA9IFBBVEhfTU9VU0VfREFUQTIpCgoKIyBDcmVhdGUgdGhlIFNldXJhdCBvYmplY3QgYW5kIGZpcnN0IGZpbHRlcgpOb3RfcHJvY2Vzc2VkX1NldXJhdF9tMiA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gbW91c2VfZGF0YTIsIG1pbi5jZWxscyA9IDMsIG1pbi5mZWF0dXJlcyA9IDIwMCwgcHJvamVjdCA9ICIxOTAyMTEiKQpgYGAKCmBgYHtyICwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KIyBMb2FkIGluIHRoZSBVTUkgbWF0cml4CnVtaV9zcGFyc2UyIDwtIEdldEFzc2F5RGF0YShvYmplY3QgPSBOb3RfcHJvY2Vzc2VkX1NldXJhdF9tMiwgc2xvdCA9ICJjb3VudHMiKQoKIyBMb2FkIGluIHRoZSBIVE8gY291bnQgbWF0cml4CnJhdy5odG8yIDwtIFJlYWQxMFgoUEFUSF9IVE9fREFUQTIsIGdlbmUuY29sdW1uID0gMSkKaHRvMiA8LSByYXcuaHRvMltjKDE6OCksXQoKcm93bmFtZXMoaHRvMikgPC0gYygiU3BsZWVuLU1QIiwiU3BsZWVuLU0iLCJTcGxlZW4tY3RybCIsIlNwbGVlbi1QIiwiVGh5bXVzLU1QIiwiVGh5bXVzLU0iLCJUaHltdXMtY3RybCIsIlRoeW11cy1QIikKCiMgU2VsZWN0IGNlbGwgYmFyY29kZXMgZGV0ZWN0ZWQgYnkgYm90aCBSTkEgYW5kIEhUTwpqb2ludF9iY3MyIDwtIGludGVyc2VjdChjb2xuYW1lcyh1bWlfc3BhcnNlMiksY29sbmFtZXMoaHRvMikpCmh0bzIgPC0gYXMubWF0cml4KGh0bzJbLGpvaW50X2JjczJdKQoKIyBDb25maXJtIHRoYXQgdGhlIEhUTyBoYXZlIHRoZSBjb3JyZWN0IG5hbWVzCnByaW50IChyb3duYW1lcyhodG8yKSkKYGBgCgpgYGB7cixldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CnBhcihtZnJvdz1jKDEsMSkpCnBhcihsYXM9MikKcGFyKG1hcj1jKDUsMTUsMywzKSkKYmFycGxvdChyb3dTdW1zKGh0bzIpLCBtYWluID0gInNlcXVlbmNlZCBIVE8gZGlzdHJpYnV0aW9uIiwgaG9yaXo9VFJVRSkKCnJvd1N1bXMoaHRvMikKYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KIyMjIFNldHVwIHNldXJhdCBvYmplY3QgYW5kIGFkZCBpbiB0aGUgaHRvIGRhdGEKIyBTZXR1cCBTZXVyYXQgb2JqZWN0Cmhhc2h0YWcyIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSB1bWlfc3BhcnNlMlssam9pbnRfYmNzMiBdLCBhc3NheSA9ICJSTkEiLCBwcm9qZWN0ID0gIjE5MDIxMSIpCgojIE5vcm1hbGl6ZSBSTkEgZGF0YSB3aXRoIGxvZyBub3JtYWxpemF0aW9uCmhhc2h0YWcyIDwtIE5vcm1hbGl6ZURhdGEoaGFzaHRhZzIsZGlzcGxheS5wcm9ncmVzcyA9IEZBTFNFKQojIEZpbmQgYW5kIHNjYWxlIHZhcmlhYmxlIGdlbmVzCmhhc2h0YWcyIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGhhc2h0YWcyLGRvLnBsb3QgPSBGLHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCwgZGlzcGxheS5wcm9ncmVzcyA9IEZBTFNFKQpoYXNodGFnMiA8LSBTY2FsZURhdGEoaGFzaHRhZzIsZ2VuZXMudXNlID0gaGFzaHRhZzJAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXMsZGlzcGxheS5wcm9ncmVzcyA9IEZBTFNFKQpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFLGV2YWw9KHBhcnQxID09IFRSVUUpfQojIyMgQWRkaW5nIEhUTyBkYXRhIGFzIGFuIGluZGVwZW5kZW50IGFzc2F5CiMgQWRkIEhUTyBkYXRhIGFzIGEgbmV3IGFzc2F5IGluZGVwZW5kZW50IGZyb20gUk5BCmhhc2h0YWcyW1siSFRPIl1dIDwtIENyZWF0ZUFzc2F5T2JqZWN0KGNvdW50cyA9IGh0bzIpCmhhc2h0YWcyIDwtIFNldEFzc2F5RGF0YShoYXNodGFnMixhc3NheSA9ICJIVE8iLHNsb3QgPSAiY291bnRzIixuZXcuZGF0YSA9IGh0bzIpCiMgTm9ybWFsaXplIEhUTyBkYXRhLCBoZXJlIHdlIHVzZSBjZW50ZXJlZCBsb2ctcmF0aW8gKENMUikgdHJhbnNmb3JtYXRpb24KaGFzaHRhZzIgPC0gTm9ybWFsaXplRGF0YShoYXNodGFnMiwgYXNzYXkgPSAiSFRPIixub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJDTFIiLGRpc3BsYXkucHJvZ3Jlc3MgPSBGQUxTRSkKYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KI1J1biBIVE9kZW11eCBqdXN0IHRvIGdldCB0aGUgSFRPX21heElEIGZpZWxkCmhhc2h0YWcyIDwtIEhUT0RlbXV4KGhhc2h0YWcyLCBhc3NheSA9ICJIVE8iLCBwb3NpdGl2ZS5xdWFudGlsZSA9IDAuOTksIHZlcmJvc2UgPSBGQUxTRSkKI0RlbXVsdGlwbGV4IGNlbGxzIGJhc2VkIG9uIEhUTyBlbnJpY2htZW50Cmhhc2h0YWcyIDwtIE1VTFRJc2VxRGVtdXgoaGFzaHRhZzIsIGFzc2F5ID0gIkhUTyIsYXV0b1RocmVzaCA9IFRSVUUsIG1heGl0ZXIgPSAxMCxxcmFuZ2UgPSBzZXEoZnJvbSA9IDAuMSwgdG8gPSAwLjksIGJ5ID0gMC4wNSksIHZlcmJvc2UgPSBUUlVFKQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyNEZW11bHRpcGxleGluZyByZXN1bHRzIHsudGFic2V0fQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMjQ2VsbHMgY2xhc3NpZmljYXRpb24KYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CmRhdGF0YWJsZShhcy5tYXRyaXgodGFibGUoaGFzaHRhZzJAbWV0YS5kYXRhJE1VTFRJX0lEKSksY29sbmFtZXMgPSAiTnVtYmVyIG9mIGNlbGxzIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIyBWaW9saW5wbG90IChmZWF0dXJlcykKYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClZsblBsb3QoaGFzaHRhZzIsZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSxwdC5zaXplID0gMC4xLCBsb2cgPSBUUlVFLCAgZ3JvdXAuYnkgPSAiTVVMVElfSUQiKQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMjIFZpb2xpbiBwbG90cyAoSFRPIGNvdW50cykKYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClZsblBsb3QoaGFzaHRhZzIsZmVhdHVyZXMgPSBjKCJuQ291bnRfSFRPIikscHQuc2l6ZSA9IDAuMSwgbG9nID0gVFJVRSwgIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIHRTTkVzIGJhc2VkIG9uIEhUTwpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KIyBDYWxjdWxhdGUgYSBkaXN0YW5jZSBtYXRyaXggdXNpbmcgSFRPCmh0by5kaXN0Lm10eCA8LSBhcy5tYXRyaXgoZGlzdCh0KEdldEFzc2F5RGF0YShvYmplY3QgPSBoYXNodGFnMiwgYXNzYXkgPSAiSFRPIikpKSkKCiMgQ2FsY3VsYXRlIHRTTkUgZW1iZWRkaW5ncyB3aXRoIGEgZGlzdGFuY2UgbWF0cml4Cmhhc2h0YWcyIDwtIFJ1blRTTkUoaGFzaHRhZzIsIGRpc3RhbmNlLm1hdHJpeCA9IGh0by5kaXN0Lm10eCwgcGVycGxleGl0eSA9IDEwMCkKYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CkRpbVBsb3QoaGFzaHRhZzIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIyBIVE8gbWFyZ2luCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gNywgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9ClRzbmU8LWRhdGEuZnJhbWUoCiAgdFNORV8xID0gaGFzaHRhZzJAcmVkdWN0aW9ucyR0c25lQGNlbGwuZW1iZWRkaW5nc1ssMV0sCiAgdFNORV8yPSBoYXNodGFnMkByZWR1Y3Rpb25zJHRzbmVAY2VsbC5lbWJlZGRpbmdzWywyXSwKICBnZW5lPSBoYXNodGFnMkBtZXRhLmRhdGEkSFRPX21hcmdpbgopCgpIVE89IGhhc2h0YWcyQG1ldGEuZGF0YSRNVUxUSV9JRApNYXg9bWF4KGhhc2h0YWcyQG1ldGEuZGF0YSRIVE9fbWFyZ2luKQpNaW49bWluKGhhc2h0YWcyQG1ldGEuZGF0YSRIVE9fbWFyZ2luKQoKZ2dwbG90KFRzbmUsYWVzKHg9dFNORV8xLHk9dFNORV8yKSkrZ2VvbV9wb2ludChhZXMoY29sb3I9Z2VuZSxzaGFwZT1IVE8pKSsKICAgICAgICAgICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdyA9ICJibHVlIixtaWQ9Im9yYW5nZSIsaGlnaD0icmVkIixuYW1lPSJIVE8gbWFyZ2luIixtaWRwb2ludD0oTWF4K01pbikvMikrc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUpKQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMjIFJpZGdlIHBsb3RzCgoqKlZpc3VhbGl6ZSBlbnJpY2htZW50IGZvciBzZWxlY3RlZCBIVE9zIHdpdGggcmlkZ2UgcGxvdHMqKgpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodCA9IDQsIG1lc3NhZ2U9RkFMU0UsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQpSaWRnZVBsb3QoaGFzaHRhZzIsIGFzc2F5ID0gIkhUTyIsIGZlYXR1cmVzID0gcm93bmFtZXMoR2V0QXNzYXlEYXRhKGhhc2h0YWcxLGFzc2F5ID0gIkhUTyIpKVsxOjJdLG5jb2wgPSAyLCBncm91cC5ieSA9ICJNVUxUSV9JRCIpClJpZGdlUGxvdChoYXNodGFnMiwgYXNzYXkgPSAiSFRPIiwgZmVhdHVyZXMgPSByb3duYW1lcyhHZXRBc3NheURhdGEoaGFzaHRhZzEsYXNzYXkgPSAiSFRPIikpWzM6NF0sbmNvbCA9IDIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikKUmlkZ2VQbG90KGhhc2h0YWcyLCBhc3NheSA9ICJIVE8iLCBmZWF0dXJlcyA9IHJvd25hbWVzKEdldEFzc2F5RGF0YShoYXNodGFnMSxhc3NheSA9ICJIVE8iKSlbNTo2XSxuY29sID0gMiwgZ3JvdXAuYnkgPSAiTVVMVElfSUQiKQpSaWRnZVBsb3QoaGFzaHRhZzIsIGFzc2F5ID0gIkhUTyIsIGZlYXR1cmVzID0gcm93bmFtZXMoR2V0QXNzYXlEYXRhKGhhc2h0YWcxLGFzc2F5ID0gIkhUTyIpKVs3OjhdLG5jb2wgPSAyLCBncm91cC5ieSA9ICJNVUxUSV9JRCIpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KCiMjIFNhbXBsZSBJbmZvcm1hdGlvbgoKVGhlIGFuYWx5c2lzIHdpbGwgYmUgcnVuIG9uIHRoZSBzYW1wbGUgMiAoMTkwMjExKS4KCkR1cmluZyB0aGUgc2FtcGxlIGxvYWRpbmcsIHdlIGZpbHRlciBjZWxscyB0aGF0IGRvIG5vdCBwYXNzIHRoZSBmb2xsb3dpbmcgZmlsdGVycy4KClVzZWQgcGFyYW1ldGVycyBpbiB0aGUgU2V1cmF0ICpDcmVhdGVTZXVyYXRPYmplY3QqIGZ1bmN0aW9uOgoqIG1pbi5nZW5lczogMyAuIEluY2x1ZGUgY2VsbHMgd2hlcmUgYXQgbGVhc3QgMyBnZW5lcyBhcmUgZGV0ZWN0ZWQKKiBtaW4uY2VsbHM6IDIwMCAuIEluY2x1ZGUgZ2VuZXMgd2l0aCBkZXRlY3RlZCBleHByZXNzaW9uIGluIGF0IGxlYXN0IDIwMCBjZWxscwoKQWZ0ZXIgdGhvc2UgZmlsdGVycywgdGhlIHJlbWFpbmluZyBjZWxsIG51bWJlciBpcyAqKmByIGxlbmd0aChjb2xuYW1lcyhoYXNodGFnMkBhc3NheXMkUk5BQGRhdGEpKSoqLgpgYGAKCgpgYGB7ciBjZWxsX3NlbGVjdF8yLCByZXN1bHRzPSdhc2lzJyxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CiNhZGQgRXhwMiBjZWxsIGlkZW50aXR5CkhUT19jcjIgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMkBtZXRhLmRhdGEsIE1VTFRJX0lEID09ICJTcGxlZW4tY3RybCIgKSkKSFRPX2N0MiA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiVGh5bXVzLWN0cmwiICkpCkhUT19tcjIgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMkBtZXRhLmRhdGEsIE1VTFRJX0lEPT0gIlNwbGVlbi1NIiApKQpIVE9fbXQyIDwtIHJvdy5uYW1lcyhzdWJzZXQoaGFzaHRhZzJAbWV0YS5kYXRhLCBNVUxUSV9JRD09ICJUaHltdXMtTSIgKSkKSFRPX3ByMiA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiU3BsZWVuLVAiICkpCkhUT19wdDIgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMkBtZXRhLmRhdGEsIE1VTFRJX0lEPT0gIlRoeW11cy1QIiApKQpIVE9fcG1yMiA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiU3BsZWVuLU1QIiApKQpIVE9fcG10MiA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiVGh5bXVzLU1QIiApKQpIVE9fZDIgPC0gcm93Lm5hbWVzKHN1YnNldChoYXNodGFnMkBtZXRhLmRhdGEsIE1VTFRJX0lEPT0gIkRvdWJsZXQiICkpCkhUT19uMiA8LSByb3cubmFtZXMoc3Vic2V0KGhhc2h0YWcyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiTmVnYXRpdmUiICkpCgpIVE9fdGh5bXVzMiA9IGMoSFRPX2N0MixIVE9fbXQyLEhUT19wdDIsSFRPX3BtdDIpCkhUT19zcGxlZW4yID0gYyhIVE9fY3IyLEhUT19tcjIsSFRPX3ByMixIVE9fcG1yMikKSFRPX2lkZW50aWZpZWQyID0gYyhIVE9fdGh5bXVzMiwgSFRPX3NwbGVlbjIpCgojIENyZWF0ZSBhIFNldXJhdCBvYmplY3Qgd2l0aG91dCBkb3VibGV0IGFuZCB1bmFzc2lnbmVkIGNlbGxzIChyZW1vdmUgIm5lZ2F0aXZlIiwgImRvdWJsZXQiICYgIm5vdGhpbmciKSkKY2xlYW4uc3Vic2V0MiA8LSBzdWJzZXQoeCA9IGhhc2h0YWcyLCBjZWxscyA9IEhUT19pZGVudGlmaWVkMikKVmxuUGxvdChjbGVhbi5zdWJzZXQyLGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiKSxwdC5zaXplID0gMC4xLCBsb2cgPSBUUlVFLCAgZ3JvdXAuYnkgPSAiTVVMVElfSUQiKQpgYGAKCgpgYGB7YXNpcywgZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPVRSVUV9CkFmdGVyIHJlbW92aW5nIGRvdWJsZXRzIGFuZCBuZWdhdGl2ZSBjZWxscywgdGhlIHJlbWFpbmluZyBjZWxsIG51bWJlciBpcyAqKmByIGxlbmd0aChjb2xuYW1lcyhjbGVhbi5zdWJzZXQyQGFzc2F5cyRSTkFAZGF0YSkpKiouCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyBBZGRpbmcgQURUCmBgYAoKCmBgYHtyIGxvYWRfYWR0LCAgbWVzc2FnZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89aWYgKHBhcnQxKSBUUlVFIGVsc2UgRkFMU0V9CiMgTG9hZCBpbiB0aGUgVU1JIG1hdHJpeAp1bWkgPC0gR2V0QXNzYXlEYXRhKG9iamVjdCA9IGNsZWFuLnN1YnNldDIsIHNsb3QgPSAiY291bnRzIikKCiMgTG9hZCBpbiB0aGUgQURUIGNvdW50IG1hdHJpeApyYXcuYWR0IDwtIFJlYWQxMFgoUEFUSF9BRFRfREFUQTIsIGdlbmUuY29sdW1uID0gMSkKYWR0IDwtIHJhdy5hZHRbYygxOjYpLF0KCnJvd25hbWVzKGFkdCkgPC0gYygiQ0Q0IiwiQ0Q1IiwiQ0Q4IiwiQ0QyNSIsIkNENDQiLCJDRDY5IikKCiNjcmVhdGUgYW4gZW1wdHkgbWF0cml4IGNvbnRhaW5pbmcgTkFzCkNlbGwubGlzdCA8LSBjb2xuYW1lcyhHZXRBc3NheURhdGEob2JqZWN0ID0gY2xlYW4uc3Vic2V0MltbIlJOQSJdXSwgc2xvdCA9ICJkYXRhIiApICkKQURULmxpc3QgPC0gYyh1bmlxdWUocm93bmFtZXMoYWR0KSkpCm1hdC5hZHQgPC0gbWF0cml4KG5yb3cgPSBsZW5ndGgoQURULmxpc3QpLCBuY29sID0gbGVuZ3RoKENlbGwubGlzdCkpCnJvd25hbWVzKG1hdC5hZHQpID0gQURULmxpc3QKY29sbmFtZXMobWF0LmFkdCkgPSBDZWxsLmxpc3QKCiMgR2V0IGNlbGwgYmFyY29kZXMgZGV0ZWN0ZWQgYnkgYm90aCBSTkEgYW5kIEFEVApqb2ludF9iY3MgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKHVtaSksY29sbmFtZXMoYWR0KSkKYWR0IDwtIGFzLm1hdHJpeChhZHRbLGpvaW50X2Jjc10pCgojIEZpbGwgdGhlIGVtcHR5IG1hdHJpeCB3aXRoIHZhbHVlcyB3aGVuIGV4aXN0aW5nCm1hdC5hZHRbLGpvaW50X2Jjc108LWFkdFssam9pbnRfYmNzXQoKIyBBZGQgQURUIGRhdGEgYXMgYSBuZXcgYXNzYXkgaW5kZXBlbmRlbnQgZnJvbSBSTkEKY2xlYW4uc3Vic2V0MltbIkFEVCJdXSA8LSBDcmVhdGVBc3NheU9iamVjdChjb3VudHMgPSBtYXQuYWR0Wyxjb2xuYW1lcyhjbGVhbi5zdWJzZXQyKV0pCgojIE5vcm1hbGl6ZSBBRFQgZGF0YSwgaGVyZSB3ZSB1c2UgY2VudGVyZWQgbG9nLXJhdGlvIChDTFIpIHRyYW5zZm9ybWF0aW9uCmNsZWFuLnN1YnNldDIgPC0gTm9ybWFsaXplRGF0YShjbGVhbi5zdWJzZXQyLCBhc3NheSA9ICJBRFQiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJDTFIiKQoKI1NjYWxlCmNsZWFuLnN1YnNldDIgPC0gU2NhbGVEYXRhKGNsZWFuLnN1YnNldDIsIGFzc2F5ID0gIkFEVCIpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQpBRFQgbGlzdCA6CmBgYAoKCmBgYHtyICwgcmVzdWx0cz0nYXNpcycsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQpwcmludCAocm93bmFtZXMoYWR0KSkKYGBgCgpgYGB7ciBTaWduaWZpY2FudF9QQywgaW5jbHVkZT1GQUxTRSxldmFsPShwYXJ0MSA9PSBUUlVFKX0KIyBPQkpFQ1QgVFdPIFBST0NFU1NJTkcgQU5EIFNBVkUKIzEtIFFDIApTZXVyYXQyIDwtIFFDX2Z1bmN0aW9uX21pdG9fdGhyZXNob2xkKFNldXJhdCA9IGNsZWFuLnN1YnNldDIsIG1pdG9fdGhyZXNob2xkID0gMC4xLCBkb19wbG90ID0gRkFMU0UpCiAgCiMyLSBGaW5kIHZhcmlhYmxlIGdlbmVzClNldXJhdDIgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMob2JqZWN0ID0gU2V1cmF0MiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJSTkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwLCB2ZXJib3NlID0gRkFMU0UsIGRvLnBsb3Q9VFJVRSkKICAKU2V1cmF0MiA8LSBTY2FsZURhdGEoU2V1cmF0MiwgCiAgICAgICAgICAgICAgICAgICAgICAgYXNzYXk9IlJOQSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAjZG8uc2NhbGUgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICAgZG8uY2VudGVyID0gVFJVRSkKICAKU2V1cmF0MiA8LSBSdW5QQ0Eob2JqZWN0ID0gU2V1cmF0MiwKICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJSTkEiLAogICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwgI2lmIFRSVUUgcHJpbnQgdGhlIHRvcCBnZW5lcyBmb3IgZWFjaCBQQwogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gIFZhcmlhYmxlRmVhdHVyZXMob2JqZWN0ID0gU2V1cmF0MiksIAogICAgICAgICAgICAgICAgICAgIHNlZWQudXNlID0gMTIzNCwKICAgICAgICAgICAgICAgICAgICBucGNzID0gNTApIAogIApFbGJvd1Bsb3QoU2V1cmF0MiwgbmRpbXMgPSA0MCwgcmVkdWN0aW9uID0gInBjYSIpCiAgClNldXJhdCA8LSBQcm9qZWN0RGltKG9iamVjdCA9IFNldXJhdDIsCiAgICAgICAgICAgICAgICAgICAgICAgbmZlYXR1cmVzLnByaW50ID0gMjAsCiAgICAgICAgICAgICAgICAgICAgICAgZGltcy5wcmludCA9IDE6MTApCgpTZXVyYXQyIDwtIFJ1blRTTkUob2JqZWN0ID0gU2V1cmF0MiwKICAgICAgICAgICAgICAgICAgICAgZG8uZmFzdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICBzZWVkLnVzZSA9IDEyMzQsCiAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjIwLCAKICAgICAgICAgICAgICAgICAgICAgcGVycGxleGl0eSA9IDQwKQogIApTZXVyYXQyIDwtIEZpbmROZWlnaGJvcnMob2JqZWN0ID0gU2V1cmF0MiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMToyMCAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZS5yZWNhbGMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInBjYSIpCiAgClNldXJhdDIgPC0gRmluZENsdXN0ZXJzKG9iamVjdCA9IFNldXJhdDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBSRVNPTFVUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEyMzQpCiAgClNldXJhdDIgPC0gUnVuVU1BUChvYmplY3QgPSBTZXVyYXQyLCByZWR1Y3Rpb24gPSAicGNhIiwgc2VlZC51c2UgPSAxMjM0LCBkaW1zID0gMToyMCkKICAKc2F2ZShTZXVyYXQyLCBmaWxlID0gcGFzdGUwKE9VVFBVVF9QQVRILCAiU2V1cmF0X2NsZWFuLXN1YnNldF90b21lcmdlXyIsIFNBTVBMRTIsICIuUm9iaiIpKQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MSA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgTWl0b2Nob25kcmlhbCBwZXJjZW50YWdlIHZlcnN1cyBuRmVhdHVyZXMKYGBgCgpgYGB7ciBtaXRvX3ZzX25mZWF0dXJlczIsZXZhbD0ocGFydDEgPT0gVFJVRSApLCBlY2hvPWlmIChwYXJ0MSkgVFJVRSBlbHNlIEZBTFNFfQpkZjwtZGF0YS5mcmFtZShtdWx0aS5pZD1TZXVyYXQyQG1pc2Mkb2xkX21ldGFfZGF0YSRNVUxUSV9JRCxwZXJjZW50Lm1pdG89U2V1cmF0MkBtaXNjJG9sZF9tZXRhX2RhdGEkcGVyY2VudC5taXRvLG5GZWF0dXJlX1JOQT1TZXVyYXQyQG1pc2Mkb2xkX21ldGFfZGF0YSRuRmVhdHVyZV9STkEpCmdncGxvdGx5KGdncGxvdChkZixhZXMoeD1uRmVhdHVyZV9STkEseT1wZXJjZW50Lm1pdG8sY29sb3I9bXVsdGkuaWQpKStnZW9tX3BvaW50KCkpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyBVTUFQOgpgYGAKCmBgYHtyIFVNQVBfSFRPX3NldXJhdF8yLGV2YWw9KHBhcnQxID09IFRSVUUgKSwgZWNobz1pZiAocGFydDEpIFRSVUUgZWxzZSBGQUxTRX0KZ2dwbG90bHkoRGltUGxvdChTZXVyYXQyLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIiwgZG8ubGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMSkpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KI01lcmdpbmcgb3VyIHR3byBleHBlcmltZW50cwpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgTG9hZCBzZXBhcmF0ZSBSIG9iamVjdApZb3UgY2FuIGxvYWQgb2JqZWN0cyBkb25lIHdpdGggdGhlIGNvZGUgYWJvdmUuCk9yIG91ciBvYmplY3QgPz8gKGxpbmsgKQpgYGAKCmBgYHtyIFNhbXBsZXNfbG9hZGluZyxldmFsPShwYXJ0MiA9PSBUUlVFICkgLGluY2x1ZGU9RkFMU0V9CiNsb2FkIGFsbCBzZXVyYXQgb2JqZWN0cyBidWlsdCBwcmV2aW91c2x5CmxvYWQocGFzdGUwKE9VVFBVVF9QQVRILCAiU2V1cmF0X2NsZWFuLXN1YnNldF90b21lcmdlXyIsIFNBTVBMRTEsICIuUm9iaiIpKQpsb2FkKHBhc3RlMChPVVRQVVRfUEFUSCwgIlNldXJhdF9jbGVhbi1zdWJzZXRfdG9tZXJnZV8iLCBTQU1QTEUyLCAiLlJvYmoiKSkKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDIgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIEludGVncmF0aW5nIHRoZSAyIHNldXJhdCBvYmplY3RzIHdpdGggc2V1cmF0IGludGVncmF0aW9uIChjY2EpCmBgYAoKYGBge3IsIENDQSwgZXZhbD0ocGFydDIgPT0gVFJVRSApLGluY2x1ZGU9RkFMU0V9CiMgR2VuZSBzZWxlY3Rpb24gZm9yIGlucHV0IHRvIENDQQpGaW5kVmFyaWFibGVGZWF0dXJlcyhvYmplY3QgPSBTZXVyYXQxLCAKICAgICAgICBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDAsIHZlcmJvc2UgPSBGQUxTRSkKRmluZFZhcmlhYmxlRmVhdHVyZXMob2JqZWN0ID0gU2V1cmF0MiwgCiAgICAgICAgc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSAyMDAwLCB2ZXJib3NlID0gRkFMU0UpCgpleHAuYW5jaG9ycyA8LSBGaW5kSW50ZWdyYXRpb25BbmNob3JzKG9iamVjdC5saXN0ID0gYyhTZXVyYXQyLFNldXJhdDEpLCBkaW1zID0gMTozMCkKCmdlbmUxIDwtIHJvd25hbWVzKEdldEFzc2F5RGF0YShTZXVyYXQxLCBhc3NheSA9ICJSTkEiLCBzbG90ID0gImRhdGEiICkpCmdlbmUyIDwtIHJvd25hbWVzKEdldEFzc2F5RGF0YShTZXVyYXQyLCBhc3NheSA9ICJSTkEiLCBzbG90ID0gImRhdGEiICkpCmNvbW1vbl9nZW5lcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KGdlbmUxLGdlbmUyKSkKCmV4cDEuMi5pbnRlZ3JhdGVkIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gZXhwLmFuY2hvcnMsIGZlYXR1cmVzLnRvLmludGVncmF0ZSA9IGNvbW1vbl9nZW5lcyxkaW1zID0gMTozMCkKYGBgCgoKYGBge2FzaXMsIGV2YWw9KHBhcnQyID09IFRSVUUgKSwgZWNobz1UUlVFfQpXZSBpZGVudGlmaWVkICoqYHIgbGVuZ3RoKGdlbmUxKWAqKiBleHByZXNzZWQgaW4gc2FtcGxlMSBhbmQgKipgciBsZW5ndGgoZ2VuZTIpYCoqIGV4cHJlc3NlZCBpbiBzYW1wbGUyLiAqKmByIGxlbmd0aChjb21tb25fZ2VuZXMpYCoqIGFyZSBpbiBjb21tb24gaW4gdGhpcyB0d28gc2V0IGFuZCB3aWxsIHRoZSBpbnRlZ3JhdGVkIGluIHRoZSBtZXJnZWQgYW5kIGNvcnJlY3RlZCBvYmplY3QuCgoKIyMgVU1BUDoKCiMgQW5hbHlzaXMgcGFydAoKIyMgU2FtcGxlIEluZm9ybWF0aW9uCgpUaGUgYW5hbHlzaXMgd2lsbCBiZSBydW4gb24gdGhlIHNhbXBsZSBNWUNfUFRFTl8wMSAoMTgxMDMxICYgMTkwMjExKS4KCkR1cmluZyB0aGUgc2FtcGxlIGxvYWRpbmcsIHdlIGZpbHRlciBjZWxscyB0aGF0IGRvIG5vdCBwYXNzIHRoZSBmb2xsb3dpbmcgZmlsdGVycy4gV2UgYWxzbyBmaWx0ZXIgY2VsbHMgdGhhdCBhcmUgZGV0ZWN0ZWQgYXMgaHVtYW4vbW91c2UgbXVsdGlwbGV0IHVzaW5nIHRoZWlyIGJhcmNvZGVzLiAgCkhlcmUgYXJlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aG9zZSBwYXJhbWV0ZXJzIGluIHRoZSBTZXVyYXQgKkNyZWF0ZVNldXJhdE9iamVjdCogZnVuY3Rpb246CgoqIG1pbi5nZW5lczogSW5jbHVkZSBjZWxscyB3aGVyZSBhdCBsZWFzdCB0aGlzIG1hbnkgZ2VuZXMgYXJlIGRldGVjdGVkCiogbWluLmNlbGxzOiBJbmNsdWRlIGdlbmVzIHdpdGggZGV0ZWN0ZWQgZXhwcmVzc2lvbiBpbiBhdCBsZWFzdCB0aGlzIG1hbnkgY2VsbHMKCmBgYAoKYGBge3IgZmlsdGVycywgZXZhbD0ocGFydDIgPT0gVFJVRSApLHJlc3VsdHM9J2FzaXMnLGluY2x1ZGU9RkFMU0V9CiMgQWZmaWNoZSBsZXMgcGFyYW1ldHJlcwpGaWx0ZXJfcGFyYW1ldGVycyA8LSBkYXRhLmZyYW1lKCkKRmlsdGVyX3BhcmFtZXRlcnNbIlZhbHVlIiwgIm1pbi5jZWxscyJdIDwtIDMKRmlsdGVyX3BhcmFtZXRlcnNbIlZhbHVlIiwgIm1pbi5nZW5lcyJdIDwtIDIwMAprYWJsZShGaWx0ZXJfcGFyYW1ldGVycywgImh0bWwiLCBhbGlnbiA9ICJjIikgJT4lIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIikpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KQWZ0ZXIgdGhvc2UgZmlsdGVycywgYW5kIG1lcmdpbmcgTVlDX1BURU5fMDEgYW5kIE1ZQ19QVEVOMDIgdGhlIHJlbWFpbmluZyBjZWxsIG51bWJlciBpcyAqKmByIGxlbmd0aChjb2xuYW1lcyhleHAxLjIuaW50ZWdyYXRlZCkpYCoqLgpgYGAKCgoKYGBge3IgY2VsbF9zZWxlY3QsZXZhbD0ocGFydDIgPT0gVFJVRSApLCByZXN1bHRzPSdhc2lzJyxpbmNsdWRlPUZBTFNFfQojIyMgYWRkIEV4cDEgY2VsbCBpZGVudGl0eSAoMTgxMDMxKQojYWRkIEV4cDEgY2VsbCBpZGVudGl0eQpIVE9fY3I2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1jdHJsIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fY3Q2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1jdHJsIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fbXI2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1NIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fbXQ2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1NIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fcHI2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1QIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fcHQ2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1QIiApKSwiXzIiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fcG1yNiA8LSBpbnRlcnNlY3QocGFzdGUwKHJvdy5uYW1lcyhzdWJzZXQoU2V1cmF0MUBtZXRhLmRhdGEsIE1VTFRJX0lEID09ICJTcGxlZW4tTVAiICkpLCJfMiIpLGNvbG5hbWVzKHggPSBleHAxLjIuaW50ZWdyYXRlZCkpCkhUT19wbXQ2IDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQxQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1NUCIgKSksIl8yIiksY29sbmFtZXMoeCA9IGV4cDEuMi5pbnRlZ3JhdGVkKSkKCiMjIyBhZGQgRXhwMiBjZWxsIGlkZW50aXR5ICgxOTAyMTEpIApIVE9fY3IyIDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQyQG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1jdHJsIiApKSwiXzEiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fY3QyIDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiVGh5bXVzLWN0cmwiICkpLCJfMSIpLGNvbG5hbWVzKHggPSBleHAxLjIuaW50ZWdyYXRlZCkpCkhUT19tcjIgPC0gaW50ZXJzZWN0KHBhc3RlMChyb3cubmFtZXMoc3Vic2V0KFNldXJhdDJAbWV0YS5kYXRhLCBNVUxUSV9JRD09ICJTcGxlZW4tTSIgKSksIl8xIiksY29sbmFtZXMoeCA9IGV4cDEuMi5pbnRlZ3JhdGVkKSkKSFRPX210MiA8LSBpbnRlcnNlY3QocGFzdGUwKHJvdy5uYW1lcyhzdWJzZXQoU2V1cmF0MkBtZXRhLmRhdGEsIE1VTFRJX0lEPT0gIlRoeW11cy1NIiApKSwiXzEiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQpIVE9fcHIyIDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiU3BsZWVuLVAiICkpLCJfMSIpLGNvbG5hbWVzKHggPSBleHAxLjIuaW50ZWdyYXRlZCkpCkhUT19wdDIgPC0gaW50ZXJzZWN0KHBhc3RlMChyb3cubmFtZXMoc3Vic2V0KFNldXJhdDJAbWV0YS5kYXRhLCBNVUxUSV9JRD09ICJUaHltdXMtUCIgKSksIl8xIiksY29sbmFtZXMoeCA9IGV4cDEuMi5pbnRlZ3JhdGVkKSkKSFRPX3BtcjIgPC0gaW50ZXJzZWN0KHBhc3RlMChyb3cubmFtZXMoc3Vic2V0KFNldXJhdDJAbWV0YS5kYXRhLCBNVUxUSV9JRD09ICJTcGxlZW4tTVAiICkpLCJfMSIpLGNvbG5hbWVzKHggPSBleHAxLjIuaW50ZWdyYXRlZCkpCkhUT19wbXQyIDwtIGludGVyc2VjdChwYXN0ZTAocm93Lm5hbWVzKHN1YnNldChTZXVyYXQyQG1ldGEuZGF0YSwgTVVMVElfSUQ9PSAiVGh5bXVzLU1QIiApKSwiXzEiKSxjb2xuYW1lcyh4ID0gZXhwMS4yLmludGVncmF0ZWQpKQoKCgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGEkSFRPID0gIm5vdGhpbmciCmV4cDEuMi5pbnRlZ3JhdGVkQG1ldGEuZGF0YVtIVE9fY3IyLF0kSFRPID0gIldUIHNwbGVlbiIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19jdDIsXSRIVE8gPSAiV1QgdGh5bXVzIgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGFbSFRPX2NyNixdJEhUTyA9ICJXVCBzcGxlZW4iCmV4cDEuMi5pbnRlZ3JhdGVkQG1ldGEuZGF0YVtIVE9fY3Q2LF0kSFRPID0gIldUIHRoeW11cyIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19wcjIsXSRIVE8gPSAiUFRFTi0gc3BsZWVuIgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGFbSFRPX3B0MixdJEhUTyA9ICJQVEVOLSB0aHltdXMiCmV4cDEuMi5pbnRlZ3JhdGVkQG1ldGEuZGF0YVtIVE9fcHI2LF0kSFRPID0gIlBURU4tIHNwbGVlbiIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19wdDYsXSRIVE8gPSAiUFRFTi0gdGh5bXVzIgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGFbSFRPX21yMixdJEhUTyA9ICJNWUMtIHNwbGVlbiIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19tdDIsXSRIVE8gPSAiTVlDLSB0aHltdXMiCmV4cDEuMi5pbnRlZ3JhdGVkQG1ldGEuZGF0YVtIVE9fbXI2LF0kSFRPID0gIk1ZQy0gc3BsZWVuIgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGFbSFRPX210NixdJEhUTyA9ICJNWUMtIHRoeW11cyIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19wbXIyLF0kSFRPID0gIk15Yy0gUFRFTi0gc3BsZWVuIgpleHAxLjIuaW50ZWdyYXRlZEBtZXRhLmRhdGFbSFRPX3BtdDIsXSRIVE8gPSAiTXljLSBQVEVOLSB0aHltdXMiCmV4cDEuMi5pbnRlZ3JhdGVkQG1ldGEuZGF0YVtIVE9fcG1yNixdJEhUTyA9ICJNeWMtIFBURU4tIHNwbGVlbiIKZXhwMS4yLmludGVncmF0ZWRAbWV0YS5kYXRhW0hUT19wbXQ2LF0kSFRPID0gIk15Yy0gUFRFTi0gdGh5bXVzIgoKSFRPX3RoeW11cyA9IGMoSFRPX2N0MixIVE9fbXQyLEhUT19wdDIsSFRPX3BtdDIsSFRPX2N0NixIVE9fbXQ2LEhUT19wdDYsSFRPX3BtdDYpCkhUT19zcGxlZW4gPSBjKEhUT19jcjIsSFRPX21yMixIVE9fcHIyLEhUT19wbXIyLEhUT19jcjYsSFRPX21yNixIVE9fcHI2LEhUT19wbXI2KQoKaWRlbnRpZmllZCA8LSBjKEhUT190aHltdXMsSFRPX3NwbGVlbikKVmxuUGxvdChleHAxLjIuaW50ZWdyYXRlZCxmZWF0dXJlcyA9ICJuRmVhdHVyZV9STkEiLHB0LnNpemUgPSAwLjEsIGxvZyA9IFRSVUUsICBncm91cC5ieSA9ICJNVUxUSV9JRCIpClZsblBsb3QoZXhwMS4yLmludGVncmF0ZWQsZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIixwdC5zaXplID0gMC4xLCBsb2cgPSBUUlVFLCAgZ3JvdXAuYnkgPSAiSFRPIikKVmxuUGxvdChleHAxLjIuaW50ZWdyYXRlZCxmZWF0dXJlcyA9ICJuRmVhdHVyZV9STkEiLHB0LnNpemUgPSAwLjEsIGxvZyA9IFRSVUUsICBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKClNldXJhdCA8LSBleHAxLjIuaW50ZWdyYXRlZApgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgVU1BUCBhbmQgY2x1c3RlcmluZyBwYXJhbWV0ZXIKYGBgCgpgYGB7ciBTaWduaWZpY2FudF9QQ19tZXJnZSwgZXZhbD0ocGFydDIgPT0gVFJVRSApLGluY2x1ZGU9RkFMU0V9CiMgVHJhaXRlbWVudCBkZSBsJ29iamV0ClNldXJhdCA8LSBTY2FsZURhdGEoIG9iamVjdCA9ICBTZXVyYXQsIAogICAgICAgICAgICAgICAgICAgICAgYXNzYXk9ImludGVncmF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgI2RvLnNjYWxlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkby5jZW50ZXIgPSBUUlVFKQogIApTZXVyYXQgPC0gUnVuUENBKG9iamVjdCA9IFNldXJhdCwgZmVhdHVyZXMgPSBWYXJpYWJsZUZlYXR1cmVzKFNldXJhdCksIG5wY3MgPSA1MCwgc2VlZC51c2UgPSAxMjM0LCB2ZXJib3NlID0gRkFMU0UpCiAgCkVsYm93UGxvdChTZXVyYXQsIG5kaW1zID0gNDAsIHJlZHVjdGlvbiA9ICJwY2EiKQogIApTZXVyYXQgPC0gUHJvamVjdERpbShvYmplY3QgPSBTZXVyYXQsCiAgICAgICAgICAgICAgICAgIGFzc2F5PSJpbnRlZ3JhdGVkIiwKICAgICAgICAgICAgICAgICAgbmZlYXR1cmVzLnByaW50ID0gMjAsCiAgICAgICAgICAgICAgICAgIGRpbXMucHJpbnQgPSAxOjEyKQogIApTZXVyYXQgPC0gRmluZE5laWdoYm9ycyhvYmplY3QgPSBTZXVyYXQsIAogICAgICAgICAgICAgICAgICBkaW1zID0gMToxMiAsIAogICAgICAgICAgICAgICAgICBhc3NheT0iaW50ZWdyYXRlZCIsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkjLCAKICAgICAgICAgICAgICAgICAgI2ZvcmNlLnJlY2FsYyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAjcmVkdWN0aW9uID0gInBjYSIpCiAgClNldXJhdCA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gU2V1cmF0LCAKICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgIGFzc2F5PSJpbnRlZ3JhdGVkIiwKICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEyMzQpCiAgICAKICAjVG8gbWFrZSB0aGUgVU1BUAogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClNldXJhdCA8LSBSdW5VTUFQKG9iamVjdCA9IFNldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIHNlZWQudXNlID0gMTIzNCwgZGltcyA9IDE6MTIpCiAgCkRpbVBsb3Qob2JqZWN0ID0gU2V1cmF0LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKQogIApzYXZlKFNldXJhdCwgZmlsZSA9IHBhc3RlMChPVVRQVVRfUEFUSCwgIlNldXJhdC1pbnRlZ3JhdGVkX3JlcDFfcmVwMi5Sb2JqIikpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgTWVyZ2UgY2hlY2tpbmcgey50YWJzZXR9CiMjIyBIVE8KYGBgCgpgYGB7cixldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89RkFMU0V9CmdncGxvdGx5KERpbVBsb3QoU2V1cmF0LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIkhUTyIsIGRvLmxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDEpKwogICAgICAgICAgIGdndGl0bGUoIlVNQVAgY29sb3JyZWQgYnkgSFRPIGNsYXNzaWZpY2F0aW9uIikpCmBgYAoKYGBge2FzaXMsIGV2YWw9KHBhcnQyID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyMgT3JpZy5pZGVudHMKYGBgCgpgYGB7ciwgZXZhbD0ocGFydDIgPT0gVFJVRSApLGVjaG89RkFMU0V9CmdncGxvdGx5KERpbVBsb3QoU2V1cmF0LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiLCBkby5sYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAxKSkKYGBgCgoKYGBge2FzaXMsIGV2YWw9KHBhcnQyID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyBULWNlbGwgc2VsZWN0aW9uIHsudGFic2V0fQpBY2NvcmRpbmcgdG8gVC1jZWxsIG1hcmtlcnMgd2Ugd2lsbCBleGNsdWRlIENkM2QgbG93IGNsdXN0ZXJzOiAxMyAoQmNlbGxzKSwgMTEsIDE0LCAxNyAobW9ub2N5dGVzL21hY3JvcGhhZ2VzKS4KQWNjb3JkaW5nIHRvIFQtY2VsbCBtYXJrZXJzIHdlIHdpbGwgZXhjbHVkZSBDZDNkL0NkM2UgbG93IGNsdXN0ZXJzOiAxMSAoQmNlbGxzKSwgMTMsIDE3LCAxOCwgMTkgKG1vbm9jeXRlcy9tYWNyb3BoYWdlcyksIDE2LCAxNCAoSUxDL05LKS4KCiMjIyBLbm93biBSTkEgQiBhbmQgVCBtYXJrZXJzCmBgYAoKYGBge3IgYnRfbWFya2Vyc19jaGVja2luZywgZXZhbD0ocGFydDIgPT0gVFJVRSApLCBlY2hvPUZBTFNFfQpEaW1QbG90KFNldXJhdCwgbGFiZWwgPSBUKQpiY2VsbF9rbm93bl9tYXJrZXJzIDwtIGMoIkNkNzQiLCJNczRhMSIsIkNkMTkiLCJDZDNkIikKRmVhdHVyZVBsb3Qob2JqZWN0ID0gU2V1cmF0LCBmZWF0dXJlcyA9IGJjZWxsX2tub3duX21hcmtlcnMsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgIGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYmNlbGxfa25vd25fbWFya2VycyA8LSBjKCJDZDE0IiwiRmNncjMiLCJUcmRjIiwiQ2QzZCIpCkZlYXR1cmVQbG90KG9iamVjdCA9IFNldXJhdCwgZmVhdHVyZXMgPSBiY2VsbF9rbm93bl9tYXJrZXJzLCByZWR1Y3Rpb24gPSAidW1hcCIsICBjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCkZlYXR1cmVQbG90KG9iamVjdCA9IFNldXJhdCwgZmVhdHVyZXMgPSBjKCJJbDJyYSIsIktscmcxIiwiSWw3ciIsIlJvcmEiKSwgcmVkdWN0aW9uID0gInVtYXAiLCBvcmRlciA9IFRSVUUsIGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKRmVhdHVyZVBsb3Qob2JqZWN0ID0gU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkVvbWVzIiwiTmNyMSIsIlRieDIxIiwiS2l0IiksIHJlZHVjdGlvbiA9ICJ1bWFwIiwgb3JkZXIgPSBUUlVFLCBjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCiNOcmMxID0gTksKI0lMN1IgdG8gc2VwYXJhdGUgSUxDIGZyb20gTks7IElMN1IrIEVPTUVTKyBzaG91bGQgYmUgSUxDMTsgRU9NRVMrIElMN1ItIHNob3VsZCBiZSBOSwoKI2NvbXBhcmlzb24gYmV0d2VlbiBtYXJrZXIgYW5kIGNsdXN0ZXIgcG9zaXRpb24KZ2dwbG90bHkoRGltUGxvdChTZXVyYXQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZG8ubGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMSkpCmBgYAoKYGBge3IgVGNlbGxfc2VsZWN0aW9uLCBldmFsPShwYXJ0MiA9PSBUUlVFICksZWNobz1GQUxTRX0KI3JlbW92ZSBjbHVzdGVyIDExLDEyLDEzLDE3ICgjQmNlbGxzICYgbWFjcm9waGFnZXMpClQuU2V1cmF0IDwtIHN1YnNldCh4ID0gU2V1cmF0LCBpZGVudHMgPSBjKCIxMSIsIjEzIiwiMTQiLCIxNiIsIjE3IiwiMTgiLCIxOSIpLCBpbnZlcnQgPSBUUlVFKQpgYGAKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMgcmUgY2x1c3RlcmluZwpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFLCBldmFsPShwYXJ0MiA9PSBUUlVFICl9CiMgSU5URUdSQVRFIE9CSkVDVCBBTkQgU0FWRQoKIyBTZWxlY3Rpb24gd2FzIGFscmVhZHkgZG9uZSBhdCB0aGUgaW50ZWdyYXRpb24gc3RlcCwgZXZlbiBhZnRlciByZXN1YnNldHRpbmcgaXQgaXMgd29ydGggdG8gcmVzZWxlY3QgKGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRpamFsYWIvc2V1cmF0L2lzc3Vlcy8xNTI4KS4gUk5BIHNob3VsZCBiZSB1c2VkLCBidXQgdGhlbiBiYXRjaCBpcyBiYWNrLCBzdWJzZXR0aW5nIGJlZm9yZSBpbnRlZ3JhdGlvbiBpcyBub3QgZ29vZCBuZWl0aGVyIChiZXR0ZXIgdG8ga2VlcCBjZWxscyB0aGF0IGNhbiBiZSBhbGlnbmVkKS4uLiAKICAKVC5TZXVyYXQgPC0gU2NhbGVEYXRhKCBvYmplY3QgPSAgVC5TZXVyYXQsIAogICAgICAgICAgICAgICAgICAgICAgYXNzYXk9ImludGVncmF0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgI2RvLnNjYWxlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkby5jZW50ZXIgPSBUUlVFKQogIApULlNldXJhdCA8LSBSdW5QQ0Eob2JqZWN0ID0gVC5TZXVyYXQsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhULlNldXJhdCksIG5wY3MgPSAxMDAsIHNlZWQudXNlID0gMTIzNCwgdmVyYm9zZSA9IEZBTFNFKQogIApFbGJvd1Bsb3QoVC5TZXVyYXQsIG5kaW1zID0gNTAsIHJlZHVjdGlvbiA9ICJwY2EiKQoKVC5TZXVyYXQgPC0gUHJvamVjdERpbShvYmplY3QgPSBULlNldXJhdCwKICAgICAgICAgICAgICAgICAgbmZlYXR1cmVzLnByaW50ID0gMjAsCiAgICAgICAgICAgICAgICAgIGRpbXMucHJpbnQgPSAxOjEwKQogIApULlNldXJhdCA8LSBGaW5kTmVpZ2hib3JzKG9iamVjdCA9IFQuU2V1cmF0LAogICAgICAgICAgICAgICAgICBhc3NheSA9ICJpbnRlZ3JhdGVkIiwKICAgICAgICAgICAgICAgICAgZGltcyA9IDE6MTggLCAKICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKSMsIAogICAgICAgICAgICAgICAgICAjZm9yY2UucmVjYWxjID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICNyZWR1Y3Rpb24gPSAicGNhIikKICAKICBULlNldXJhdCA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gVC5TZXVyYXQsIAogICAgICAgICAgICAgICAgICBhc3NheSA9ICJpbnRlZ3JhdGVkIiwKICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IDEuOCwKICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCA9IDEyMzQpCiAgI1RvIG1ha2UgdGhlIFVNQVAKICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIFQuU2V1cmF0IDwtIFJ1blVNQVAob2JqZWN0ID0gVC5TZXVyYXQsIHJlZHVjdGlvbiA9ICJwY2EiLCBzZWVkLnVzZSA9IDEyMzQsIGRpbXMgPSAxOjE4KQogIAogIERpbVBsb3Qob2JqZWN0ID0gVC5TZXVyYXQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpCiAgcDEgPC0gRGltUGxvdChvYmplY3QgPSBULlNldXJhdCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKICBwMiA8LSBEaW1QbG90KG9iamVjdCA9IFQuU2V1cmF0LCByZWR1Y3Rpb24gPSAicGNhIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAogICAgICBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSkgKyBOb0xlZ2VuZCgpCiAgCiAgZ3JpZC5hcnJhbmdlKHAxLHAyLG5yb3cgPSAxLCBuY29sID0yLCBuZXdwYWdlPVRSVUUpCgogIHNhdmUoVC5TZXVyYXQsIGZpbGUgPSBwYXN0ZTAoT1VUUFVUX1BBVEgsICJULVNldXJhdC1tZXJnZWRfY2xlYW4tc3Vic2V0IiwgIi5Sb2JqIikpCmBgYAoKYGBge3IgLCBldmFsPShwYXJ0MiA9PSBUUlVFICksZWNobz1GQUxTRX0KIyMjIGFkZCBFeHAyIGNlbGwgaWRlbnRpdHkgKDE5MDIxMSkgCnNwbGVlbi5jZWxscyA8LSBjKHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiU3BsZWVuLWN0cmwiICkpLHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiU3BsZWVuLU0iICkpLHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiU3BsZWVuLU1QIiApKSxyb3cubmFtZXMoc3Vic2V0KFQuU2V1cmF0QG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlNwbGVlbi1QIiApKSkKCnRoeW11cy5jZWxscyA8LSBjKHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiVGh5bXVzLWN0cmwiICkpLHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiVGh5bXVzLU0iICkpLHJvdy5uYW1lcyhzdWJzZXQoVC5TZXVyYXRAbWV0YS5kYXRhLCBNVUxUSV9JRCA9PSAiVGh5bXVzLU1QIiApKSxyb3cubmFtZXMoc3Vic2V0KFQuU2V1cmF0QG1ldGEuZGF0YSwgTVVMVElfSUQgPT0gIlRoeW11cy1QIiApKSkKClQuU2V1cmF0QG1ldGEuZGF0YSR0aXNzdWUgPSAibm90aGluZyIKVC5TZXVyYXRAbWV0YS5kYXRhW3NwbGVlbi5jZWxscyxdJHRpc3N1ZSA9ICJTcGxlZW4iClQuU2V1cmF0QG1ldGEuZGF0YVt0aHltdXMuY2VsbHMsXSR0aXNzdWUgPSAiVGh5bXVzIgoKRGltUGxvdChULlNldXJhdCkKYGBgCgoKYGBge2FzaXMsIGV2YWw9KHBhcnQyID09IFRSVUUgKSwgZWNobz1UUlVFfQojIyBULWNlbGwgdW1hcHMgey50YWJzZXR9CiMjIyBIVE8KYGBgCgpgYGB7ciwgZXZhbD0ocGFydDIgPT0gVFJVRSApLGVjaG89RkFMU0V9CmdncGxvdGx5KERpbVBsb3QoVC5TZXVyYXQsIGdyb3VwLmJ5ID0gIk1VTFRJX0lEIikpCmBgYAoKCmBgYHthc2lzLCBldmFsPShwYXJ0MiA9PSBUUlVFICksIGVjaG89VFJVRX0KIyMjIGNsdXN0ZXJpbmcKYGBgCgpgYGB7ciwgZXZhbD0ocGFydDIgPT0gVFJVRSApLGVjaG89RkFMU0V9CihEaW1QbG90KFQuU2V1cmF0LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiLCBsYWJlbCA9IFRSVUUsIHB0LnNpemUgPSAxKSkKYGBgCgpgYGB7YXNpcywgZXZhbD0ocGFydDIgPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIEVORCBPRiBQUkVQUk9DRVNTSU5HCldlIG9idGFpbiB0aGUgZmluYWwgb2JqZWN0IHdpdGggY2x1c3RlcmluZyB0byBzdGFydCB0aGUgYW5hbHlzaXMKYGBgCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCg==